/*	Hier wird ArtilleryBullet zum Spawnen eingefuegt
	Drag-And-Drop des getraillerten Prefab! */
var myProjectile : GameObject;
/* Zeit in Sekunden zum Nachladen der Artillery */
var reloadTime : float = 1f;
/*	Drehgeschwindigkeit der Artillery */
var turnSpeed : float = 5f;
/* 	Zusaetzliche Variable zum Innehalten (Zielpause) 
	vor dem Schiessen fuer mehr Realisums */
var firePauseTime : float = .0f;
/*	Hier wird Small Explosion eingefuegt */
var muzzleEffect: GameObject;
/*	Wert der eine leichte Zielungenauigkeit bewirkt */
var errorAmount : float = .001;
/*	Legt fest worauf gezielt wird */
var myTarget : Transform;
/*	Hier wird festgelegt wo ArtilleryBullet und Small
	Explosion gespawnt werden */
var muzzlePositions : Transform[];
/*	Der drehbare Teil der Artillery */
var turretHead : Transform;
/*	Wann wieder geschossen werden darf*/
private var nextFireTime : float;
/* Wert fuer die Verzoegerung vor der naechsten Aktion */
private var nextMoveTime : float;
/*	Die Richtung in die gezielt werden soll*/
private var desiredRotation : Quaternion;
private var aimError : float = 0;


function Start () {

}

function Update () {

	/* Falls ich ein Ziel habe (myTarget != null)*/
	if(myTarget)
	{
		/*	Falls genug Zeit seit letzter Aktion vergangen */
		if(Time.time >= nextMoveTime)
		{
			/*	Zielrichtung errechnen. Dabei Zielposition mitliefern*/
			CalculateAimPosition(myTarget.position);
			/*Schwarze Magie: Quaternion rotiert graduell von Anfangsposition in Endposition */
			turretHead.rotation = Quaternion.Lerp(turretHead.rotation, desiredRotation, Time.deltaTime * turnSpeed);
		}
		/* Falls wieder geschossen werden darf. Groesser falls was kurz hing. */
		if(Time.time >= nextFireTime)
		{
			/* Feuer!*/
			FireProjectile();
		}
	}
}
/* 	Diese Funktion wird automatisch ausgefuehrt sobald 
	etwas in die innere Reichweite des Colliders gelangt */
function OnTriggerStay(other: Collider) // ggf. durch OnTriggerEnter tauschen
{
	if(!myTarget)						// Durch Stay notwendig: Nur falls noch kein Ziel vorhanden!
	{
		/*	Falls es sich um einen Gegner handelt*/
		if(other.gameObject.tag == "Enemy_Ground")
		{	
			/*	Zeit gewinnen, damit nicht bei direkt bei
				Feinderkennung losgefeuert wird */ 
			nextFireTime = Time.time+(reloadTime* 1.5);
			/* bis transform als Ziel setzen damit man danach
				mit myTarget.position ansprechen kann*/
			myTarget = other.gameObject.transform;
		}
	}
}

/*	Ziel loslassen */
function OnTriggerExit(other : Collider)
{
	if(other.gameObject.transform == myTarget)
	{
		myTarget = null;
	}
}

/*	MyTarget.position entgegenehmen und Zielrichtung errechnen.*/
function CalculateAimPosition(targetPos : Vector3)
{
	/*	Temp.Variable wo hingeziehlt werden soll, inklusive Fehltoleranz
		durch speichern der "MyTarget.position"s in einen Vector3*/
	var aimPoint = Vector3(targetPos.x + aimError, targetPos.y + aimError, targetPos.z + aimError);
	/*	Übertragen in die tatsächliche Rotation, die in Unity in Quaternions gehandelt wird*/
	desiredRotation = Quaternion.LookRotation(aimPoint - turretHead.position);
}

/* Berechung der Fehlertoleranz (float)*/
function CalculateAimError()
{
	//aimError = Random.Range(-errorAmount, errorAmount);
}

/* Schuss */
function FireProjectile()
{
	/*	Sound abspielen */
	audio.Play();
	/*Zuerst die Zeit neu einstellen! Aktueller Zeitpunkt + Nachladezeit*/
	nextFireTime = Time.time + reloadTime;
	/*Dann die kuerzere Drehungspause */
	nextMoveTime = Time.time + firePauseTime;
	CalculateAimError();
	
	/* Fuer jeden Emitterpunkt Bullet und Explosion erzeugen*/
	for(theMuzzlePos in muzzlePositions)
	{
		/*	Projektil instanziieren*/
		Instantiate(myProjectile, theMuzzlePos.position, theMuzzlePos.rotation);
		/*	Explosionsemitter instanziieren*/
		Instantiate(muzzleEffect, theMuzzlePos.position, theMuzzlePos.rotation);
	}
}